ISSDK  1.8
IoT Sensing Software Development Kit
register_io_spi.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /**
10  * @file register_io_spi.c
11  * @brief The register_io_spi.c file contains definitions for low-level interface functions
12  * for reading and writing sensor registers using CMSIS APIs.
13  */
14 
15 /* Standard C Includes */
16 #include <string.h>
17 
18 /* ISSDK Includes */
19 #include "issdk_hal.h"
20 #include "gpio_driver.h"
21 #include "register_io_spi.h"
22 
23 /*******************************************************************************
24  * Types
25  ******************************************************************************/
26 #define SPI_COUNT (sizeof(spiBases) / sizeof(void *))
27 
28 /*******************************************************************************
29  * Variables
30  ******************************************************************************/
33 volatile bool b_SPI_CompletionFlag[SPI_COUNT] = {false};
34 volatile uint32_t g_SPI_ErrorEvent[SPI_COUNT] = {ARM_SPI_EVENT_TRANSFER_COMPLETE};
35 
36 /*******************************************************************************
37  * Code
38  ******************************************************************************/
39 #if defined(SPI0)
40 /* The SPI0 Signal Event Handler function. */
41 void SPI0_SignalEvent_t(uint32_t event)
42 {
43  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
44  {
45  g_SPI_ErrorEvent[0] = event;
46  }
47  b_SPI_CompletionFlag[0] = true;
48 }
49 #endif
50 
51 #if defined(SPI1)
52 /* The SPI1 Signal Event Handler function. */
53 void SPI1_SignalEvent_t(uint32_t event)
54 {
55  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
56  {
57  g_SPI_ErrorEvent[1] = event;
58  }
59  b_SPI_CompletionFlag[1] = true;
60 }
61 #endif
62 
63 #if defined(SPI2)
64 /* The SPI2 Signal Event Handler function. */
65 void SPI2_SignalEvent_t(uint32_t event)
66 {
67  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
68  {
69  g_SPI_ErrorEvent[2] = event;
70  }
71  b_SPI_CompletionFlag[2] = true;
72 }
73 #endif
74 
75 #if defined(SPI3)
76 /* The SPI3 Signal Event Handler function. */
77 void SPI3_SignalEvent_t(uint32_t event)
78 {
79  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
80  {
81  g_SPI_ErrorEvent[3] = event;
82  }
83  b_SPI_CompletionFlag[3] = true;
84 }
85 #endif
86 
87 #if defined(SPI4)
88 /* The SPI4 Signal Event Handler function. */
89 void SPI4_SignalEvent_t(uint32_t event)
90 {
91  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
92  {
93  g_SPI_ErrorEvent[4] = event;
94  }
95  b_SPI_CompletionFlag[4] = true;
96 }
97 #endif
98 
99 #if defined(SPI5)
100 /* The SPI5 Signal Event Handler function. */
101 void SPI5_SignalEvent_t(uint32_t event)
102 {
103  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
104  {
105  g_SPI_ErrorEvent[5] = event;
106  }
107  b_SPI_CompletionFlag[5] = true;
108 }
109 #endif
110 
111 #if defined(SPI6)
112 /* The SPI6 Signal Event Handler function. */
113 void SPI6_SignalEvent_t(uint32_t event)
114 {
115  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
116  {
117  g_SPI_ErrorEvent[6] = event;
118  }
119  b_SPI_CompletionFlag[6] = true;
120 }
121 #endif
122 
123 #ifndef CPU_LPC55S06JBD64
124 #if defined(SPI7)
125 /* The SPI7 Signal Event Handler function. */
126 void SPI7_SignalEvent_t(uint32_t event)
127 {
128  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
129  {
130  g_SPI_ErrorEvent[7] = event;
131  }
132  b_SPI_CompletionFlag[7] = true;
133 }
134 #endif
135 #if defined(SPI8)
136 /* The SPI7 Signal Event Handler function. */
137 void SPI8_SignalEvent_t(uint32_t event)
138 {
139  if (event != ARM_SPI_EVENT_TRANSFER_COMPLETE)
140  {
141  g_SPI_ErrorEvent[8] = event;
142  }
143  b_SPI_CompletionFlag[8] = true;
144 }
145 #endif
146 #endif
147 
148 /* Control Slave Select based on inactive/active and active low/high. */
150 {
151  if (ssControl->cmdCode == ssControl->activeValue)
152  {
153  pDspiGpioDriver->set_pin(ssControl->pTargetSlavePinID);
154  }
155  else
156  {
157  pDspiGpioDriver->clr_pin(ssControl->pTargetSlavePinID);
158  }
159 }
160 
161 /*! The interface function to block write sensor registers. */
162 int32_t Register_SPI_BlockWrite(ARM_DRIVER_SPI *pCommDrv,
163  registerDeviceInfo_t *devInfo,
164  void *pWriteParams,
165  uint8_t offset,
166  const uint8_t *pBuffer,
167  uint8_t bytesToWrite)
168 {
169  int32_t status;
170  spiCmdParams_t slaveWriteCmd;
171  spiSlaveSpecificParams_t *pSlaveParams = pWriteParams;
172 
173  spiControlParams_t ss_en_cmd = {
174  .cmdCode = ARM_SPI_SS_ACTIVE,
175  .activeValue = pSlaveParams->ssActiveValue,
176  .pTargetSlavePinID = pSlaveParams->pTargetSlavePinID,
177  };
178  spiControlParams_t ss_dis_cmd = {
179  .cmdCode = ARM_SPI_SS_INACTIVE,
180  .activeValue = pSlaveParams->ssActiveValue,
181  .pTargetSlavePinID = pSlaveParams->pTargetSlavePinID,
182  };
183 
184  pSlaveParams->pWritePreprocessFN(&slaveWriteCmd, offset, bytesToWrite, (void *)pBuffer);
185  b_SPI_CompletionFlag[devInfo->deviceInstance] = false;
186  g_SPI_ErrorEvent[devInfo->deviceInstance] = ARM_SPI_EVENT_TRANSFER_COMPLETE;
187  /*! Write and the value.*/
188  register_spi_control(&ss_en_cmd);
189  status = pCommDrv->Transfer(slaveWriteCmd.pWriteBuffer, slaveWriteCmd.pReadBuffer, slaveWriteCmd.size);
190  if (ARM_DRIVER_OK == status)
191  {
192  /* Wait for completion */
193  while (!b_SPI_CompletionFlag[devInfo->deviceInstance])
194  {
195  if (devInfo->idleFunction)
196  {
197  devInfo->idleFunction(devInfo->functionParam);
198  }
199  else
200  {
201  __NOP();
202  }
203  }
204  if (g_SPI_ErrorEvent[devInfo->deviceInstance] != ARM_SPI_EVENT_TRANSFER_COMPLETE)
205  {
206  status = ARM_DRIVER_ERROR;
207  pCommDrv->Control(ARM_SPI_ABORT_TRANSFER, 0);
208  }
209  }
210  register_spi_control(&ss_dis_cmd);
211 
212  return status;
213 }
214 
215 /*! The interface function to write a sensor register. */
216 int32_t Register_SPI_Write(ARM_DRIVER_SPI *pCommDrv,
217  registerDeviceInfo_t *devInfo,
218  void *pWriteParams,
219  uint8_t offset,
220  uint8_t value,
221  uint8_t mask)
222 {
223  int32_t status;
224  uint8_t regValue;
225  spiCmdParams_t slaveReadCmd, slaveWriteCmd;
226  spiSlaveSpecificParams_t *pSlaveParams = pWriteParams;
227 
228  spiControlParams_t ss_en_cmd = {
229  .cmdCode = ARM_SPI_SS_ACTIVE,
230  .activeValue = pSlaveParams->ssActiveValue,
231  .pTargetSlavePinID = pSlaveParams->pTargetSlavePinID,
232  };
233  spiControlParams_t ss_dis_cmd = {
234  .cmdCode = ARM_SPI_SS_INACTIVE,
235  .activeValue = pSlaveParams->ssActiveValue,
236  .pTargetSlavePinID = pSlaveParams->pTargetSlavePinID,
237  };
238 
239  /*! Set the register based on the values in the register value pair configuration.*/
240  if (mask)
241  {
242  /* Get the formatted SPI Read Command. */
243  pSlaveParams->pReadPreprocessFN(&slaveReadCmd, offset, 1);
244  b_SPI_CompletionFlag[devInfo->deviceInstance] = false;
245  g_SPI_ErrorEvent[devInfo->deviceInstance] = ARM_SPI_EVENT_TRANSFER_COMPLETE;
246  /*! Read the register value.*/
247  register_spi_control(&ss_en_cmd);
248  status = pCommDrv->Transfer(slaveReadCmd.pWriteBuffer, slaveReadCmd.pReadBuffer, slaveReadCmd.size);
249  if (ARM_DRIVER_OK == status)
250  {
251  /* Wait for completion */
252  while (!b_SPI_CompletionFlag[devInfo->deviceInstance])
253  {
254  if (devInfo->idleFunction)
255  {
256  devInfo->idleFunction(devInfo->functionParam);
257  }
258  else
259  {
260  __NOP();
261  }
262  }
263  if (g_SPI_ErrorEvent[devInfo->deviceInstance] != ARM_SPI_EVENT_TRANSFER_COMPLETE)
264  {
265  status = ARM_DRIVER_ERROR;
266  pCommDrv->Control(ARM_SPI_ABORT_TRANSFER, 0);
267  }
268  }
269  register_spi_control(&ss_dis_cmd);
270 
271  /*! 'OR' in the requested values to the current contents of the register */
272  regValue = *(slaveReadCmd.pReadBuffer + pSlaveParams->spiCmdLen);
273  regValue = (regValue & ~mask) | value;
274  }
275  else
276  {
277  /*! Overwrite the register with specified value.*/
278  regValue = value;
279  }
280 
281  pSlaveParams->pWritePreprocessFN(&slaveWriteCmd, offset, 1, &regValue);
282  b_SPI_CompletionFlag[devInfo->deviceInstance] = false;
283  g_SPI_ErrorEvent[devInfo->deviceInstance] = ARM_SPI_EVENT_TRANSFER_COMPLETE;
284  /*! Write and the value.*/
285  register_spi_control(&ss_en_cmd);
286  status = pCommDrv->Transfer(slaveWriteCmd.pWriteBuffer, slaveWriteCmd.pReadBuffer, slaveWriteCmd.size);
287  if (ARM_DRIVER_OK == status)
288  {
289  /* Wait for completion */
290  while (!b_SPI_CompletionFlag[devInfo->deviceInstance])
291  {
292  if (devInfo->idleFunction)
293  {
294  devInfo->idleFunction(devInfo->functionParam);
295  }
296  else
297  {
298  __NOP();
299  }
300  }
301  if (g_SPI_ErrorEvent[devInfo->deviceInstance] != ARM_SPI_EVENT_TRANSFER_COMPLETE)
302  {
303  status = ARM_DRIVER_ERROR;
304  pCommDrv->Control(ARM_SPI_ABORT_TRANSFER, 0);
305  }
306  }
307  register_spi_control(&ss_dis_cmd);
308 
309  return status;
310 }
311 
312 /*! The interface function to read a sensor register. */
313 int32_t Register_SPI_Read(ARM_DRIVER_SPI *pCommDrv,
314  registerDeviceInfo_t *devInfo,
315  void *pReadParams,
316  uint8_t offset,
317  uint8_t length,
318  uint8_t *pOutBuffer)
319 {
320  int32_t status;
321  spiCmdParams_t slaveReadCmd;
322  spiSlaveSpecificParams_t *pSlaveParams = pReadParams;
323 
324  spiControlParams_t ss_en_cmd = {
325  .cmdCode = ARM_SPI_SS_ACTIVE,
326  .activeValue = pSlaveParams->ssActiveValue,
327  .pTargetSlavePinID = pSlaveParams->pTargetSlavePinID,
328  };
329  spiControlParams_t ss_dis_cmd = {
330  .cmdCode = ARM_SPI_SS_INACTIVE,
331  .activeValue = pSlaveParams->ssActiveValue,
332  .pTargetSlavePinID = pSlaveParams->pTargetSlavePinID,
333  };
334 
335  pSlaveParams->pReadPreprocessFN(&slaveReadCmd, offset, length);
336  b_SPI_CompletionFlag[devInfo->deviceInstance] = false;
337  g_SPI_ErrorEvent[devInfo->deviceInstance] = ARM_SPI_EVENT_TRANSFER_COMPLETE;
338  /*! Read the value.*/
339  register_spi_control(&ss_en_cmd);
340  status = pCommDrv->Transfer(slaveReadCmd.pWriteBuffer, slaveReadCmd.pReadBuffer, slaveReadCmd.size);
341  if (ARM_DRIVER_OK == status)
342  {
343  /* Wait for completion */
344  while (!b_SPI_CompletionFlag[devInfo->deviceInstance])
345  {
346  if (devInfo->idleFunction)
347  {
348  devInfo->idleFunction(devInfo->functionParam);
349  }
350  else
351  {
352  __NOP();
353  }
354  }
355  if (g_SPI_ErrorEvent[devInfo->deviceInstance] != ARM_SPI_EVENT_TRANSFER_COMPLETE)
356  {
357  status = ARM_DRIVER_ERROR;
358  pCommDrv->Control(ARM_SPI_ABORT_TRANSFER, 0);
359  }
360  }
361  register_spi_control(&ss_dis_cmd);
362 
363  memcpy(pOutBuffer, slaveReadCmd.pReadBuffer + pSlaveParams->spiCmdLen, length);
364 
365  return status;
366 }
void(* set_pin)(pinID_t aPinId)
Definition: Driver_GPIO.h:46
#define SPI_COUNT
SPI_Type *const spiBases[]
This structure defines the device specific info required by register I/O.
Definition: sensor_drv.h:102
int32_t status
The register_io_spi.h file declares low-level interface functions for reading and writing sensor regi...
#define SPI_BASE_PTRS
Definition: frdm_ke15z.h:133
This structure defines the spi slave command format.
volatile bool b_SPI_CompletionFlag[SPI_COUNT]
int32_t Register_SPI_Write(ARM_DRIVER_SPI *pCommDrv, registerDeviceInfo_t *devInfo, void *pWriteParams, uint8_t offset, uint8_t value, uint8_t mask)
The interface function to write a sensor register.
Access structure of the GPIO Driver.
Definition: Driver_GPIO.h:38
void(* clr_pin)(pinID_t aPinId)
Definition: Driver_GPIO.h:47
typedef int32_t(DATA_FORMAT_Append_t))(void *pData
The interface function to append the data on the formated stream.
fpSpiReadPreprocessFn_t pReadPreprocessFN
The SPI Slave Transfer Command Params SDK2.0 Driver.
GENERIC_DRIVER_GPIO * pDspiGpioDriver
volatile uint32_t g_SPI_ErrorEvent[SPI_COUNT]
The SPI Slave Control Command Params SDK2.0 Driver.
#define SPI_Type
Definition: frdm_ke15z.h:131
int32_t Register_SPI_BlockWrite(ARM_DRIVER_SPI *pCommDrv, registerDeviceInfo_t *devInfo, void *pWriteParams, uint8_t offset, const uint8_t *pBuffer, uint8_t bytesToWrite)
The interface function to block write to a sensor register.
void register_spi_control(spiControlParams_t *ssControl)
fpSpiWritePreprocessFn_t pWritePreprocessFN
GENERIC_DRIVER_GPIO Driver_GPIO_KSDK
Definition: gpio_driver.c:177
int32_t Register_SPI_Read(ARM_DRIVER_SPI *pCommDrv, registerDeviceInfo_t *devInfo, void *pReadParams, uint8_t offset, uint8_t length, uint8_t *pOutBuffer)
The interface function to read a sensor register.
registeridlefunction_t idleFunction
Definition: sensor_drv.h:104